\section{Capa de Red}
La capa de red se encarga de llevar los paquetes desde el origen 
hasta el destino. 
Llegar al destino puede requerir muchos saltos por switches 
intermedios. 
La capa de enlace sólo movía tramas de un extremo del cable al otro. 
La capa de red es la capa más baja que maneja la transmisión de 
extremo a extremo. 
Debe conocer la topología de la subred de comunicación (es decir, 
el grupo de switches) y elegir las rutas adecuadas a través de ella; 
también debe tener cuidado al elegir las rutas para no sobrecargar 
algunas de las líneas de comunicación y los switches y dejar 
inactivos a otros. 
También es la encargada de solucionar los problemas que surgen cuando 
el origen y el destino están en redes diferentes.

\paragraph{}
Se pueden realizar dos formas de organización distintas, dependiendo 
del tipo de servicio que se ofrezca. 
Si se ofrece el servicio no orientado a conexión, los paquetes se 
colocan individualmente en la subred y se enrutan de manera 
independiente. 
No se necesita una configuración avanzada. 
En este contexto, por lo general los paquetes se conocen como 
datagramas.
Si se utiliza el servicio orientado a conexión, antes de poder enviar 
cualquier paquete de datos, es necesario establecer una ruta del 
router de origen al de destino. 
Esta conexión se conoce como CV (circuito virtual).

\paragraph{Datagramas}
Si un mensaje es más largo que el tamaño máximo de paquete, la capa 
de red tiene que dividirlo en paquetes más chicos y enviar cada uno de 
ellos al router mediante algún protocolo punto a punto; por ejemplo, 
PPP. 
Cada router tiene una tabla interna que le indica a dónde enviar 
paquetes para cada destino posible. 
Cada entrada de tabla es un par que consiste en un destino y la línea 
de salida que se utilizará para ese destino. 
Sólo se pueden utilizar líneas conectadas directamente. 

El algoritmo que maneja las tablas y que realiza las decisiones de
routeo se llama \textsl{Algoritmo de Routeo}.

\paragraph{Circuitos Virtuales}
El propósito de los circuitos virtuales es evitar la necesidad de 
elegir una nueva ruta para cada paquete enviado. 
En su lugar, cuando se establece una conexión, se elige una ruta de 
la máquina de origen a la de destino como parte de la configuración 
de conexión y se almacena en tablas dentro de los routers. 
Esa ruta se utiliza para todo el tráfico que fluye a través de la 
conexión. 
Cuando se libera la conexión, también se termina el circuito virtual. 
Cada paquete lleva un identificador que indica a qué circuito virtual 
pertenece. 

\paragraph{Comparación}
Dentro de la subred hay varios pros y contras entre los circuitos 
virtuales y los datagramas.
Uno de ellos tiene que ver con la memoria del router y el bandwidth.
Los circuitos virtuales permiten que los paquetes contengan números 
de circuito en lugar de direcciones de destino completas. 
Si los paquetes suelen ser bastante cortos, una dirección de destino 
completa en cada paquete puede representar un overhead significativo 
y; por lo tanto, bandwidth desperdiciado. 
El precio que se paga por el uso interno de circuitos virtuales es el 
espacio de tabla en los enrutadores. 
La mejor elección desde el punto de vista económico depende del costo 
relativo entre los circuitos de comunicación y la memoria de los 
routers.

\paragraph{}
Otro punto por considerar es el del tiempo de configuración contra el 
tiempo de análisis de la dirección. 
El uso de circuitos virtuales requiere una fase de configuración, 
que consume tiempo y recursos. 
Sin embargo, determinar lo que hay que hacer con un paquete de datos 
en una subred de circuitos virtuales es fácil: el router simplemente 
usa el número de circuito para buscar en una tabla y encontrar hacia 
dónde va el paquete. 
En una subred de datagramas se requiere un procedimiento más complicado 
para localizar el destino del paquete. 
Otra cuestión es la cantidad requerida de espacio de tabla en la 
memoria del router. 
Una subred de datagramas necesita tener una entrada para cada destino 
posible, mientras que una subred de circuitos virtuales sólo necesita 
una entrada por cada circuito virtual. 
Sin embargo, los paquetes de configuración de conexión también tienen 
que enrutarse, ya que utilizan direcciones de destino, de la misma 
forma en que lo hacen los datagramas. 
Los circuitos virtuales tienen algunas ventajas en cuanto a la 
calidad del servicio y a que evitan congestiones en la subred, pues 
los recursos pueden reservarse por adelantado al establecerse la 
conexión. 
Los circuitos virtuales también tienen un problema de vulnerabilidad. 
Si se cae un router y se pierde su memoria, todos los circuitos 
virtuales que pasan por él tendrán que abortarse. 
Por el contrario, si se cae un router de datagramas, sólo sufrirán 
los usuarios cuyos paquetes estaban encolados en el router en el 
momento de la falla y, dependiendo de si ya se había confirmado o 
no su recepción. 


\begin{table}[H]
\begin{tabular}{m{3.3cm}|m{6cm}|m{6cm}|}
        & Datagramas    & Circuitos Virtuales \\ \hline
    Configuración del circuito  &   No necesaria    &   Requerida   \\
    %\hline
    & & \\
    Direccionamiento            &   
        Paquetes contienen dirs de origen y destino. &
        Paquetes contienen un número de CV corto. \\
    %\hline
    & & \\
    Información de estado       & 
        Routers no contienen información del estado de 
        las conexiones. &
        Cada CV requiere espacio de las tabla del router 
        por conexión. \\
    & & \\          
    Routing                     &
        Cada paquete se routea de manera independiente. &
        La ruta se elige al establecerse  el CV; todos los paquetes 
        siguen esa ruta. \\
    & & \\
    Consecuencias de fallas del router  & 
        Ninguna, excepto para paquetes routeados perdidos. &
        Terminan todos los CVs que pasan durante una caída a 
        través del router. \\
    & & \\
    QoS                 &
        Difícil.         &
        Fácil si se pueden asignar suficientes recursos por 
        adelantado para cada CV. \\
    & & \\
    Control de congestión   &
        Difícil.            &
        Fácil si se pueden asignar suficientes recursos por 
        adelantado para cada CV.
\end{tabular}
\end{table}

\subsection{Routing}
Es útil distinguir entre el routeo, que es el proceso consistente 
en tomar la decisión de cuáles rutas utilizar, y el forwarding, que 
consiste en la acción que se toma cuando llega un paquete. 
Se puede considerar que un router realiza dos procesos internos. 
Uno de ellos maneja cada paquete conforme llega, buscando en las 
tablas de routeo la línea de salida por la cual se enviará. 
Este proceso se conoce como forwarding. 
El otro proceso es responsable de llenar y actualizar las tablas 
de routeo. 

Propiedades que todo algoritmo de routeo debe poseer: exactitud, 
sencillez, robustez, estabilidad, equidad y optimización. 
Debe ser capaz de manejar los cambios de topología y tráfico 
sin requerir el aborto de todas las actividades en todos los hosts 
y el reinicio de la red con cada caída de un router. 
Un algoritmo estable alcanza el equilibrio y lo conserva.

\paragraph{}
Pueden agruparse en dos clases principales: no adaptativos y 
adaptativos. 
Los algoritmos no adaptativos no basan sus decisiones de routeo 
en mediciones o estimaciones del tráfico y la topología actuales. 
En cambio, la decisión de qué ruta se usará para llegar de i a j, 
se toma por adelantado, fuera de línea, y se carga en los routers 
al arrancar la red. 
Este procedimiento se conoce como enrutamiento estático. 

En contraste, los algoritmos adaptativos cambian sus decisiones de 
routeo para reflejar los cambios de topología y, por lo general 
también el tráfico. 
Los algoritmos adaptativos difieren en el lugar de donde obtienen 
su información, el momento de cambio de sus rutas y la métrica usada 
para la optimización (por ejemplo, distancia, número de saltos o 
tiempo estimado de tránsito). 

\subsubsection{Ruta más corta}
La idea es armar un grafo de la subred, en el que cada nodo representa 
un router y cada arco del grafo una línea de comunicación (enlace). 
Para elegir una ruta entre un par dado de routers, el algoritmo 
simplemente encuentra en el grafo la ruta más corta entre ellos. 

Una manera de medir la longitud de una ruta es por la cantidad de 
saltos. 
Sin embargo, también son posibles muchas otras métricas además de 
los saltos y la distancia física. 
Por ejemplo, cada arco podría etiquetarse con el retardo medio de 
encolamiento y transmisión de un paquete de prueba estándar. 
Entonces, de esta forma, la ruta más corta es la más rápida, en 
lugar de la ruta con menos arcos o kilómetros. 

Se conocen varios algoritmos de cálculo de la ruta más corta entre 
dos nodos de un grafo.
Cada nodo se etiqueta (entre paréntesis) con su distancia al nodo de 
origen a través de la mejor ruta conocida. 
Inicialmente no se conocen rutas, por lo que todos los nodos tienen 
la etiqueta infinito. 
A medida que avanza el algoritmo y se encuentran rutas, las etiquetas 
pueden cambiar, reflejando mejores rutas. 
Una etiqueta puede ser tentativa o permanente. 
Inicialmente todas las etiquetas son tentativas. 
Una vez que se descubre que una etiqueta representa la ruta más corta 
posible del origen a ese nodo, se vuelve permanente y no cambia más. 

\subsubsection{Flooding}
Cada paquete de entrada se envía por cada una de las líneas de salida, 
excepto aquella por la que llegó. 
Evidentemente genera grandes cantidades de paquetes duplicados, 
infinita a menos que se tomen algunas medidas para limitar el proceso.
(Contador inicializado con el diámetro total de la subred, llevar un 
registro de los paquetes enviados).

El flooding no es práctico en la mayoría de las aplicaciones, pero 
tiene algunos usos. 
Un posible uso es como métrica contra la que pueden compararse otros 
algoritmos de routeo. 
Flooding siempre escoge la ruta más corta posible, porque escoge en 
paralelo todas las rutas posibles. 
En consecuencia, ningún otro algoritmo puede producir un retardo más 
corto.

No requiere características especiales de la subred es que el origen
simplemente envíe un paquete distinto a todos los destinos. 
El método no sólo desperdicia bandwisth, sino que también requiere 
que el origen tenga una lista completa de todos los destinos.
En la práctica, ésta puede ser la única posibilidad, pero es el 
método menos deseable.

\paragraph{Flooding Selectivo}
Los routers no envían cada paquete de entrada por todas las líneas, 
sino sólo por aquellas que van aproximadamente en la dirección correcta.

\subsubsection{Distance Vector}
Cada router mantiene una tabla con la mejor distancia conocida a cada 
destino y la línea que se puede usar para llegar ahí. 
Estas tablas se actualizan intercambiando información con los vecinos.

\paragraph{Count to Infinity}
Este tipo de algoritmo tiene un problema que es el de count to 
infinity, puede solucionarse seteando un máximo a la cantidad de 
iteraciones, y dejando el valor de infinito en ese máximo + 1.

\subsubsection{Link State}
Cada router sabe la distancia a sus vecinos. 
Manda este paquete a los demás routers, y calcula la ruta más corta a 
los demás en base a la información obtenida.

Cada router se constuye el grafo de la subred completa porque todos 
los enlaces están representados.
Ejecuta localmente el algoritmo de Dijkstra para construir la ruta más 
corta a todos los destinos posibles. 
Los resultados de este algoritmo pueden instalarse en las tablas de 
routeo.

\subsection{Multicast}
Se requiere administración de grupo. 
Se necesita alguna manera de crear y destruir grupos, y un 
mecanismo para que los procesos se unan a los grupos y salgan de ellos. 
La forma de realizar estas tareas no le concierne al algoritmo de 
routeo. 
Lo que sí importa, es que cuando un proceso se una a un grupo, informe 
a su host este hecho. 
Es importante que los routers sepan cuáles de sus hosts pertenecen 
a qué grupos. 
Los hosts deben informar a sus enrutadores de los cambios en los 
miembros del grupo, o los routers deben enviar de manera periódica 
la lista de sus hosts. 
De cualquier manera, los routers aprenden qué hosts pertenecen a 
cuáles grupos. 
Los routers informan a sus vecinos, de manera que la información se 
propaga a través de la subred.

Cada router calcula un spanning tree que cubre a los demás routers.
Cuando se envía un paquete multicast a un grupo, el primer router 
examina su spanning tree y lo recorta, eliminando todos los enlaces 
que conduzcan a hosts que no sean miembros del grupo. 
Los paquetes se reenvían sólo a través del spanning tree apropiado.

\subsection{Mantenimiento de rutas}
Los algoritmos de routeo deben ser capaces de manejar eventuales 
caídas de nodos. 
Cada nodo envía de manera periódica un mensaje de saludo (Hello). 
Se espera que cada uno de sus vecinos responda a dicho mensaje. 
Si no se recibe ninguna respuesta, se sabe que el vecino se ha movido 
del alcance y ya no está conectado a él. 

Esta información se utiliza para eliminar rutas que ya no funcionan

%Esto ahora no va
%\subsection{Control de Congestión}

\subsection{Multiprotocol Label Switching (MPLS)}
Se agrega una etiqueta al principio de cada paquete y el routeo se 
hace en base a ella, no teniendo en cuenta la dirección destino.
Hacer que la etiqueta sea un índice de una tabla provoca que encontrar 
la línea correcta de salida sea una simple cuestión de buscar en una 
tabla. 
Al utilizar esta técnica, el routeo puede llevarse a cabo de manera 
muy rápida y los recursos que sean necesarios pueden reservarse a lo 
largo de la ruta.
% Parecido a los circuitos virtuales

Nuevo frame:
\texttt{PPP | MPLS | IP | TCP | Datos | CRC}\newline
Donde los primeros cuatro campos son headers.\newline
Header MPLS: 
\texttt{Etiqueta | QoS | S | TTL}\newline
El campo Etiqueta contiene el índice. 
El campo QoS (bits experimentales) indica la clase de servicio. 
El campo S se relaciona con colocar en una pila múltiples etiquetas 
en redes jerárquicas. 
Si tiene el valor de 1 indica que es la última etiqueta añadida al 
paquete IP, si es un 0 indica que hay más etiquetas añadidas al paquete. 
El campo TTL evita el ciclo infinito  en caso de que haya inestabilidad 
en el routeo, ya que se decrementa en cada router y al llegar a 0, 
se descarta el paquete.

Debido a que los encabezados MPLS no son parte del paquete de la capa 
de red o de la trama del enlace de datos, MPLS es en gran medida 
independiente de ambas capas. 
Entre otras cosas, esta propiedad significa que es posible construir 
switches MPLS que pueden reenviar tanto paquetes IP como celdas 
ATM, dependiendo de lo que aparezca. 
Por eso MPLS es multiprotocolo.

Cuando un paquete con MPLS llega a un router con capacidad MPLS, 
la etiqueta se utiliza como un índice en una tabla para determinar 
la línea de salida y la nueva etiqueta a utilizar. 
Esta conmutación de etiquetas se utiliza en todas las subredes de 
circuitos virtuales, debido a que las etiquetas sólo tienen importancia 
local y dos routers diferentes pueden asignar la misma etiqueta a 
paquetes hacia diferentes destinos, es decir, la etiqueta es 
reasignada a la salida de cada enrutador, por lo que no se 
mantiene la misma etiqueta en toda la ruta. 

\paragraph{Comparación con Circuitos Virtuales}
Una diferencia con respecto a los circuitos virtuales tradicionales 
es el nivel de agregación.
Ciertamente es posible que cada flujo tenga su propio conjunto de 
etiquetas a través de la subred.
Sin embargo, es más común que los routers agrupen múltiples flujos 
que terminan en un router o una LAN particulares y utilizan una 
sola etiqueta de ellos.

Con el routeo de circuitos virtuales tradicional no es posible agrupar 
en el mismo identificador de circuitos virtuales varias rutas 
diferentes con diferentes puntos finales, debido a que podría no haber 
forma de distinguirlas en el destino final. 
Con MPLS, los paquetes aún contienen su dirección de destino final, 
además de la etiqueta, a fin de que al final de la red de MPLS pueda 
eliminarse la etiqueta y que el reenvío pueda continuar de la forma 
normal, utilizando la dirección de destino de la capa de red.

En las redes de circuitos virtuales tradicionales, cuando un usuario 
desea establecer una conexión, se inicia un paquete de configuración 
en la red para crear la ruta y crear las entradas de la tabla 
de forwarding. 
MPLS no funciona de esa forma porque no hay fase de configuración 
para cada conexión.

% Se pueden generarn circuitos virtuales on demand, más o menos 
% con MPLS.

\subsection{Fragmentación}
Cada red impone un tamaño máximo a sus paquetes, por diversas razones 
(hardware, sistema operativo, protocolos, cumplimiento de standars, 
deseo de reducir las retransmisiones inducidas por errores, 
deseo de evitar que un paquete ocupe el canal demasiado tiempo, etc).
Por lo tanto, al querer enviar un paquete cuyo tamaño es mayor al 
máximo, hay que fragmentarlo. 


 


































